//============================================================================================
/**
 * @file	fld_menu.h
 * @brief	フィールドメニュー処理用ヘッダ
 * @author	Hiroyuki Nakamura
 */
//============================================================================================
#ifndef FLD_MENU_H
#define FLD_MENU_H

#include "field/itemuse.h"
#include "field/field_skill.h"
#include "field_skill_local.h"
#include "field_hblank.h"
#include "system/bmp_menu.h"

#undef GLOBAL
#ifdef FLD_MENU_H_GLOBAL
#define GLOBAL	/*	*/
#else
#define GLOBAL	extern
#endif


//============================================================================================
//	定数定義
//============================================================================================
#define	FIELD_MENU_MAX		( 10 )					// 項目最大数
#define	FLDMENU_CLACT_MAX	( FIELD_MENU_MAX + 1 )	// セルアクター最大数（項目＋カーソル）

#define FLD_MENU_VANISH_ZUKAN	( 0x00000001 )		// 図鑑を隠す
#define FLD_MENU_VANISH_PLIST	( 0x00000002 )		// ポケモンリストを隠す
#define FLD_MENU_VANISH_BAG		( 0x00000004 )		// バッグを隠す
#define FLD_MENU_VANISH_TRCARD	( 0x00000008 )		// トレーナーカードを隠す
#define FLD_MENU_VANISH_REPORT	( 0x00000010 )		// レポートを隠す
#define FLD_MENU_VANISH_CONFIG	( 0x00000020 )		// 設定を隠す
#define FLD_MENU_VANISH_CLOSE	( 0x00000040 )		// 「閉じる」を隠す
#define FLD_MENU_VANISH_CHAT	( 0x00000080 )		// チャットを隠す
#define FLD_MENU_VANISH_RETIRE	( 0x00000100 )		// リタイアを隠す
#define FLD_MENU_VANISH_POKEGEAR ( 0x00000200 )		// ポケギアを隠す

#define FLDMENU_CLACT_RESOURCE_TYPE_NUM	( 4)

//--------------------------------------------------------------
/// FldMenu_ExecuteCheck用 ID
//==============================================================
enum{
	FLD_APPEAR_ZUKAN=0,
	FLD_APPEAR_BALL,
	FLD_APPEAR_BAG,
	FLD_APPEAR_POKEGEAR,
	FLD_APPEAR_CARD,
	FLD_APPEAR_REPORT,
	FLD_APPEAR_CONFIG,
	// ↑順番固定
	FLD_APPEAR_SHOES,
	FLD_APPEAR_MAX,
};

// フィールドメニューワーク
typedef struct {
	GF_BGL_BMPWIN	win;		// BMPウィンドウ（メニュー）
	GF_BGL_BMPWIN	ball_win;	// BMPウィンドウ（ボール数）

	BMPMENU_WORK * mw;
	BMP_MENULIST_DATA * ld;	// BMPリストデータ
	u16	pos;				// メニュー位置
	u16	seq;				// シーケンス
	u32	ret;				// 戻り値
	u32	menu_num;			// 今回のメニュー項目の数

	u8	list[ FIELD_MENU_MAX ];		// メニューリスト
	u8	item[ FIELD_MENU_MAX ];		// メニューアイテム配置リスト

	FIELD_CLACT	fcat;		// セルアクター設定データ
	CATS_ACT_PTR	cap[FLDMENU_CLACT_MAX];

	CLACT_SET_PTR 			clactSet;								// セルアクターセット
	CLACT_U_EASYRENDER_DATA	renddata;								// 簡易レンダーデータ
	CLACT_U_RES_MANAGER_PTR	resMan[FLDMENU_CLACT_RESOURCE_TYPE_NUM];				// リソースマネージャ
	CLACT_U_RES_OBJ_PTR 	resObjTbl[FLDMENU_CLACT_RESOURCE_TYPE_NUM];		// リソースオブジェテーブル
	CLACT_HEADER			clActHeader;// セルアクターヘッダー
	CLACT_WORK_PTR			NaviActWork;				// セルアクターワークポインタ配列



	u32	clact_max;			// セルアクター登録数

	u32	ev_flg;				// メニュー制御フラグ
	u32	union_flg;			// ユニオンルームフラグ

	GMEVENT_FUNC	app_func;

	ITEMCHECK_WORK	item_check;		// アイテム使用チェックワーク
	SKILLCHECK_WORK	skill_check;	// 技使用チェックワーク

	void * app_wk;			// 汎用ワークポインタ
	void * tmp_wk;			// 汎用ワークポインタ２（各画面を行き来する場合に使用）

	FIELD_HBLANK_OBJ *HblankFunc;
}FLD_MENU;

// フィールドメニューシーケンス
enum {
	FLD_MENU_SEQ_INIT = 0,		// 初期化
	FLD_MENU_SEQ_MAKE,			// フィールドメニュー作成
	FLD_MENU_SEQ_SUBLCD_CHG,	// 下画面変更待ち
	FLD_MENU_SEQ_SELECT,		// メニュー選択

	FLD_MENU_SEQ_APP_CALL,		// アプリ呼び出し
	FLD_MENU_SEQ_APP_WAIT,		// アプリ終了待ち

	FLD_MENU_SEQ_REPORT_CALL,
	FLD_MENU_SEQ_REPORT_WAIT,

	FLD_MENU_SEQ_SHINKA_INIT,	// 進化画面呼び出し
	FLD_MENU_SEQ_SHINKA_MAIN,	// 進化画面待ち

	FLD_MENU_SEQ_BLACK_IN_END,
	FLD_MENU_SEQ_BLACK_IN_END_WAIT,

	FLD_MENU_SEQ_BLACK_IN_EVCHG,
	FLD_MENU_SEQ_BLACK_IN_EVCHG_WAIT,
	FLD_MENU_SEQ_EVCALL_WAIT,

	FLD_MENU_SEQ_AGAIN,
	FLD_MENU_SEQ_END,

	FLD_MENU_SEQ_WAIT_BLACK_IN,
	FLD_MENU_SEQ_END_NOMENU,

	FLD_MENU_SEQ_UNION_BOARD_CALL,
	FLD_MENU_SEQ_UNION_BOARD_WAIT,
};


// メール画面のモード
#define	FM_MAIL_MODE_VIEW		( 3 )		// メールを見る
#define	FM_MAIL_MODE_READ		( 2 )		// メールを読む
#define	FM_MAIL_MODE_MAKE_LIST	( 0 )		// メールを持たせる（ポケモンリストから）
#define	FM_MAIL_MODE_MAKE_BAG	( 1 )		// メールを持たせる（バッグから）


//============================================================================================
//	プロトタイプ宣言
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * フィールドメニュー起動チェック
 *
 * @param	repw	フィールドワーク
 *
 * @retval	"TRUE = 起動可"
 * @retval	"FALSE = 起動不可"
 *
 * @li	「なぞのばしょ」でメニューを開けないようにするチェック
 *
 *	2006/10/24 by nakahiro
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL FieldMenuCallCheck( FIELDSYS_WORK * repw );

//--------------------------------------------------------------------------------------------
/**
 * フィールドメニュー起動処理（通常）
 *
 * @param	repw	フィールドワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
GLOBAL void FieldMenuInit( struct _FIELDSYS_WORK * repw );

//--------------------------------------------------------------------------------------------
/**
 * フィールドメニュー起動処理（ユニオンルーム用）
 *
 * @param	repw	フィールドワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
GLOBAL void FieldMenuInitUnion( struct _FIELDSYS_WORK * repw );

//--------------------------------------------------------------------------------------------
/**
 * フィールドメニュー起動処理（対戦部屋用）
 *
 * @param	repw	フィールドワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
GLOBAL void FieldMenuInitVS( FIELDSYS_WORK * repw );

//--------------------------------------------------------------------------------------------
/**
 * フィールドメニュー起動割り込み処理（通常）
 *
 * @param	repw	フィールドワーク
 *
 * @return	none
 *
 *	看板などの処理を中断して呼び出す処理
 */
//--------------------------------------------------------------------------------------------
GLOBAL void FieldMenuEvChg( FIELDSYS_WORK * repw );

//--------------------------------------------------------------------------------------------
/**
 * フィールドメニュー起動割り込み処理（ユニオンルーム用）
 *
 * @param	repw	フィールドワーク
 *
 * @return	none
 *
 *	看板などの処理を中断して呼び出す処理
 */
//--------------------------------------------------------------------------------------------
GLOBAL void FieldMenuEvChgUnion( FIELDSYS_WORK * repw );

//--------------------------------------------------------------------------------------------
/**
 * アプリ終了待ち処理セット
 *
 * @param	wk		ワーク
 * @param	func	終了待ち処理
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
GLOBAL void FldMenu_AppWaitFuncSet( FLD_MENU * wk, void * func );

//--------------------------------------------------------------------------------------------
/**
 * イベントコール終了待ち処理セット
 *
 * @param	wk		ワーク
 * @param	func	終了待ち処理
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
GLOBAL void FldMenu_EvCallWaitFuncSet( FLD_MENU * wk, void * func );

//--------------------------------------------------------------------------------------------
/**
 * ポケモンリスト終了処理
 *
 * @param	event	フィールドイベント用パラメータ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL FldMenu_PokeListEnd( GMEVENT_CONTROL * event );

//--------------------------------------------------------------------------------------------
/**
 * メールワーク作成
 *
 * @param	item		アイテム番号
 * @param	mode		処理モード
 * @param	poke_pos	手持ちポケモンの何匹目に持たせるか
 *
 * @return	取得したメールワーク
 */
//--------------------------------------------------------------------------------------------
GLOBAL void * FieldMenu_MailWorkMake( u16 item, u8 mode, u8 poke_pos );

//--------------------------------------------------------------------------------------------
/**
 * メール画面終了処理
 *
 * @param	event	フィールドイベント用パラメータ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL FldMenu_MailEnd( GMEVENT_CONTROL * event );

//--------------------------------------------------------------------------------------------
/**
 * サブアプリ終了処理（アプリワーク解放処理込み）
 *
 * @param	event	フィールドイベント用パラメータ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL FldMenu_SubAppFreeEnd( GMEVENT_CONTROL * event );

//--------------------------------------------------------------------------------------------
/**
 * フォトアルバムフロー終了処理
 *
 * @param	event	フィールドイベント用パラメータ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL FldMenu_AlbumEnd( GMEVENT_CONTROL * event );

//--------------------------------------------------------------------------------------------
/**
 * タウンマップ終了処理（空を飛ぶ）
 *
 * @param	event	フィールドイベント用パラメータ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL FldMenu_SorawotobuEnd( GMEVENT_CONTROL * event );

extern int FldMenu_ExecuteCheck( FIELDSYS_WORK *fsys, int index );

//--------------------------------------------------------------------------------------------
/**
 * バトルレコーダー終了処理
 *
 * @param	event	フィールドイベント用パラメータ
 *
 * @return	0
 */
//--------------------------------------------------------------------------------------------
GLOBAL BOOL FldMenu_BattleRecoderEnd( GMEVENT_CONTROL * event );


//==============================================================================
//	データ
//==============================================================================
GLOBAL const u8 PST_PageTbl_Normal[];


#undef GLOBAL
#endif	/* FLD_MENU_H */